<!doctype html><html lang=en dir=auto><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="index, follow"><title>CocoaPods 命令的详细介绍 | wenbin</title><meta name=keywords content="iOS开发杂货,CocoaPods"><meta name=description content="本文按照官网的叙述用大白话“翻译”出来，加上个人的经验和见解，可以更方便理解
参考链接 CocoaPods官网之命令的详细介绍
前言 很多同学们分不清 pod install 和 pod update 命令的区别和用法，认为 pod install 只有第一次安装时和报错提示时使用，其实不是这样的。第三方库的版本有时候决定了我们开发的进度和心情，管理好这些版本可以使开发者更方便的使用。
先从Podfile文件讲起。
Podfile 文件 新建的Podfile文件，添加了 inhibit_all_warnings!，作用是忽略第三方库的警告。
# platform :ios, '9.0' 把 # 删了，作用是指定平台和版本，否则 pod install 后会出现警告，但是貌似没什么副作用。
# use_frameworks!，一般混编或是用 Swift 导入时需要打开，其它情况不用处理即可。
接下来是个容易被忽略的点
pod 'FMDB', '2.0' pod 'FMDB', '~> 2.0'
区别就是： pod 'FMDB', '2.0' 只会导入2.0版本的 pod 'FMDB', '~> 2.0' 会导入2.0大版本的最新版，比如最新版是2.9，那这样写就会导入2.9版本，但是不会超过3.0版本。
pod install 第一次都会使用该命令，会把每个安装的库的版本写入 Podfile.lock 文件中，不管有没有指定库的版本，都会把当前安装的版本写入。
在后面添加或删除库时使用该命令不会影响到其余库的版本，因为 Podfile.lock 已经锁定了，不会去检查更新每个库的版本。
pod outdated 会列出当前所有库的最新版本
pod update 如果采用 pod 'FMDB', '~> 2.0' 导入并执行 pod update 则会检查更新到最新版本，例如2."><meta name=author content><link rel=canonical href=https://imwenbin.com/blog/cocoapods-%E5%91%BD%E4%BB%A4%E7%9A%84%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D/><meta name=google-site-verification content="XYZabc"><meta name=yandex-verification content="XYZabc"><meta name=msvalidate.01 content="XYZabc"><link rel=icon href=https://imwenbin.com/favicon.ico><link rel=icon type=image/png sizes=16x16 href=https://imwenbin.com/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=https://imwenbin.com/favicon-32x32.png><link rel=icon type=image/png sizes=400x400 href=https://imwenbin.com/favicon-400x400.png><link rel=icon type=image/png sizes=512x512 href=https://imwenbin.com/favicon-512x512.png><link rel=apple-touch-icon href=https://imwenbin.com/apple-touch-icon.png><link rel=apple-touch-icon sizes=57x57 href=https://imwenbin.com/apple-touch-icon-57x57.png><link rel=apple-touch-icon sizes=60x60 href=https://imwenbin.com/apple-touch-icon-60x60.png><link rel=apple-touch-icon sizes=72x72 href=https://imwenbin.com/apple-touch-icon-72x72.png><link rel=apple-touch-icon sizes=76x76 href=https://imwenbin.com/apple-touch-icon-76x76.png><link rel=apple-touch-icon sizes=114x114 href=https://imwenbin.com/apple-touch-icon-114x114.png><link rel=apple-touch-icon sizes=120x120 href=https://imwenbin.com/apple-touch-icon-120x120.png><link rel=apple-touch-icon sizes=144x144 href=https://imwenbin.com/apple-touch-icon-144x144.png><link rel=apple-touch-icon sizes=152x152 href=https://imwenbin.com/apple-touch-icon-152x152.png><link rel=apple-touch-icon sizes=180x180 href=https://imwenbin.com/apple-touch-icon-180x180.png><link rel=mask-icon href=https://imwenbin.com/safari-pinned-tab.svg><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><link crossorigin=anonymous href=/assets/css/stylesheet.min.css rel="preload stylesheet" as=style><script defer crossorigin=anonymous src=/assets/js/highlight.min.js onload=hljs.initHighlightingOnLoad()></script><meta name=generator content="Hugo 0.104.3"><noscript><style>#theme-toggle,.top-link{display:none}</style><style>@media(prefers-color-scheme:dark){:root{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--theme)}.list:not(.dark)::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-thumb{border-color:var(--theme)}}</style></noscript><meta property="og:title" content="CocoaPods 命令的详细介绍"><meta property="og:description" content="本文按照官网的叙述用大白话“翻译”出来，加上个人的经验和见解，可以更方便理解
参考链接 CocoaPods官网之命令的详细介绍
前言 很多同学们分不清 pod install 和 pod update 命令的区别和用法，认为 pod install 只有第一次安装时和报错提示时使用，其实不是这样的。第三方库的版本有时候决定了我们开发的进度和心情，管理好这些版本可以使开发者更方便的使用。
先从Podfile文件讲起。
Podfile 文件 新建的Podfile文件，添加了 inhibit_all_warnings!，作用是忽略第三方库的警告。
# platform :ios, '9.0' 把 # 删了，作用是指定平台和版本，否则 pod install 后会出现警告，但是貌似没什么副作用。
# use_frameworks!，一般混编或是用 Swift 导入时需要打开，其它情况不用处理即可。
接下来是个容易被忽略的点
pod 'FMDB', '2.0' pod 'FMDB', '~> 2.0'
区别就是： pod 'FMDB', '2.0' 只会导入2.0版本的 pod 'FMDB', '~> 2.0' 会导入2.0大版本的最新版，比如最新版是2.9，那这样写就会导入2.9版本，但是不会超过3.0版本。
pod install 第一次都会使用该命令，会把每个安装的库的版本写入 Podfile.lock 文件中，不管有没有指定库的版本，都会把当前安装的版本写入。
在后面添加或删除库时使用该命令不会影响到其余库的版本，因为 Podfile.lock 已经锁定了，不会去检查更新每个库的版本。
pod outdated 会列出当前所有库的最新版本
pod update 如果采用 pod 'FMDB', '~> 2.0' 导入并执行 pod update 则会检查更新到最新版本，例如2."><meta property="og:type" content="article"><meta property="og:url" content="https://imwenbin.com/blog/cocoapods-%E5%91%BD%E4%BB%A4%E7%9A%84%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D/"><meta property="article:section" content="Blog"><meta property="article:published_time" content="2021-11-18T09:32:36+08:00"><meta property="article:modified_time" content="2021-11-18T09:32:36+08:00"><meta property="og:site_name" content="wenbin"><meta name=twitter:card content="summary"><meta name=twitter:title content="CocoaPods 命令的详细介绍"><meta name=twitter:description content="本文按照官网的叙述用大白话“翻译”出来，加上个人的经验和见解，可以更方便理解
参考链接 CocoaPods官网之命令的详细介绍
前言 很多同学们分不清 pod install 和 pod update 命令的区别和用法，认为 pod install 只有第一次安装时和报错提示时使用，其实不是这样的。第三方库的版本有时候决定了我们开发的进度和心情，管理好这些版本可以使开发者更方便的使用。
先从Podfile文件讲起。
Podfile 文件 新建的Podfile文件，添加了 inhibit_all_warnings!，作用是忽略第三方库的警告。
# platform :ios, '9.0' 把 # 删了，作用是指定平台和版本，否则 pod install 后会出现警告，但是貌似没什么副作用。
# use_frameworks!，一般混编或是用 Swift 导入时需要打开，其它情况不用处理即可。
接下来是个容易被忽略的点
pod 'FMDB', '2.0' pod 'FMDB', '~> 2.0'
区别就是： pod 'FMDB', '2.0' 只会导入2.0版本的 pod 'FMDB', '~> 2.0' 会导入2.0大版本的最新版，比如最新版是2.9，那这样写就会导入2.9版本，但是不会超过3.0版本。
pod install 第一次都会使用该命令，会把每个安装的库的版本写入 Podfile.lock 文件中，不管有没有指定库的版本，都会把当前安装的版本写入。
在后面添加或删除库时使用该命令不会影响到其余库的版本，因为 Podfile.lock 已经锁定了，不会去检查更新每个库的版本。
pod outdated 会列出当前所有库的最新版本
pod update 如果采用 pod 'FMDB', '~> 2.0' 导入并执行 pod update 则会检查更新到最新版本，例如2."><script type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Blogs","item":"https://imwenbin.com/blog/"},{"@type":"ListItem","position":2,"name":"CocoaPods 命令的详细介绍","item":"https://imwenbin.com/blog/cocoapods-%E5%91%BD%E4%BB%A4%E7%9A%84%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D/"}]}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"BlogPosting","headline":"CocoaPods 命令的详细介绍","name":"CocoaPods 命令的详细介绍","description":"本文按照官网的叙述用大白话“翻译”出来，加上个人的经验和见解，可以更方便理解\n参考链接 CocoaPods官网之命令的详细介绍\n前言 很多同学们分不清 pod install 和 pod update 命令的区别和用法，认为 pod install 只有第一次安装时和报错提示时使用，其实不是这样的。第三方库的版本有时候决定了我们开发的进度和心情，管理好这些版本可以使开发者更方便的使用。\n先从Podfile文件讲起。\nPodfile 文件 新建的Podfile文件，添加了 inhibit_all_warnings!，作用是忽略第三方库的警告。\n# platform :ios, '9.0' 把 # 删了，作用是指定平台和版本，否则 pod install 后会出现警告，但是貌似没什么副作用。\n# use_frameworks!，一般混编或是用 Swift 导入时需要打开，其它情况不用处理即可。\n接下来是个容易被忽略的点\npod 'FMDB', '2.0' pod 'FMDB', '~\u0026gt; 2.0'\n区别就是： pod 'FMDB', '2.0' 只会导入2.0版本的 pod 'FMDB', '~\u0026gt; 2.0' 会导入2.0大版本的最新版，比如最新版是2.9，那这样写就会导入2.9版本，但是不会超过3.0版本。\npod install 第一次都会使用该命令，会把每个安装的库的版本写入 Podfile.lock 文件中，不管有没有指定库的版本，都会把当前安装的版本写入。\n在后面添加或删除库时使用该命令不会影响到其余库的版本，因为 Podfile.lock 已经锁定了，不会去检查更新每个库的版本。\npod outdated 会列出当前所有库的最新版本\npod update 如果采用 pod 'FMDB', '~\u0026gt; 2.0' 导入并执行 pod update 则会检查更新到最新版本，例如2.","keywords":["iOS开发杂货","CocoaPods"],"articleBody":" 本文按照官网的叙述用大白话“翻译”出来，加上个人的经验和见解，可以更方便理解\n参考链接 CocoaPods官网之命令的详细介绍\n前言 很多同学们分不清 pod install 和 pod update 命令的区别和用法，认为 pod install 只有第一次安装时和报错提示时使用，其实不是这样的。第三方库的版本有时候决定了我们开发的进度和心情，管理好这些版本可以使开发者更方便的使用。\n先从Podfile文件讲起。\nPodfile 文件 新建的Podfile文件，添加了 inhibit_all_warnings!，作用是忽略第三方库的警告。\n# platform :ios, '9.0' 把 # 删了，作用是指定平台和版本，否则 pod install 后会出现警告，但是貌似没什么副作用。\n# use_frameworks!，一般混编或是用 Swift 导入时需要打开，其它情况不用处理即可。\n接下来是个容易被忽略的点\npod 'FMDB', '2.0' pod 'FMDB', '~\u003e 2.0'\n区别就是： pod 'FMDB', '2.0' 只会导入2.0版本的 pod 'FMDB', '~\u003e 2.0' 会导入2.0大版本的最新版，比如最新版是2.9，那这样写就会导入2.9版本，但是不会超过3.0版本。\npod install 第一次都会使用该命令，会把每个安装的库的版本写入 Podfile.lock 文件中，不管有没有指定库的版本，都会把当前安装的版本写入。\n在后面添加或删除库时使用该命令不会影响到其余库的版本，因为 Podfile.lock 已经锁定了，不会去检查更新每个库的版本。\npod outdated 会列出当前所有库的最新版本\npod update 如果采用 pod 'FMDB', '~\u003e 2.0' 导入并执行 pod update 则会检查更新到最新版本，例如2.9。 如果没有指定版本，只是 pod 'FMDB ，则会更新到最新的版本，例如4.2.3。\n总之会忽略 Podfile.lock 中已经锁定的版本。\npod update PODNAME 会检查并更新指定库的版本。 pod update 会检查并更新所有库的版本。\n执行完该命令后，会将新版本的版本号写入 Podfile.lock 中。\n用途实例 比如A和B两个人一起合作写代码。\nA引入一个库版本为1.0，pod install 后使用，此时这个库可能有2.0版本了。B拉下项目后 pod install 就会和A使用同一环境的pod，这时B添加一个库进去，执行 pod install A也执行 pod install ，他们还是同一环境。\n但是如果B拉下项目后执行了 pod update ，那么库的版本从1.0更新到了2.0，到时候B添加项目，A执行 pod install 后逻辑就会出问题了。\n如果必须更新某个库，一定要执行 pod update PODNAME，并且制定版本号，方便你我他使用。\n最后 在开发中不管是单人还是多人，使用pod优先使用 pod install 命令，并且养成指定版本号的习惯。 最重要的是知道自己的逻辑，到底是要更新还是直接安装。\npush的时候一定要把 Podfile.lock 文件提交上去，要不就乱套了 push的时候一定要把 Podfile.lock 文件提交上去，要不就乱套了 push的时候一定要把 Podfile.lock 文件提交上去，要不就乱套了\n完。\n","wordCount":"131","inLanguage":"en","datePublished":"2021-11-18T09:32:36+08:00","dateModified":"2021-11-18T09:32:36+08:00","mainEntityOfPage":{"@type":"WebPage","@id":"https://imwenbin.com/blog/cocoapods-%E5%91%BD%E4%BB%A4%E7%9A%84%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D/"},"publisher":{"@type":"Organization","name":"wenbin","logo":{"@type":"ImageObject","url":"https://imwenbin.com/favicon.ico"}}}</script></head><body id=top><script>localStorage.getItem("pref-theme")==="dark"?document.body.classList.add("dark"):localStorage.getItem("pref-theme")==="light"?document.body.classList.remove("dark"):window.matchMedia("(prefers-color-scheme: dark)").matches&&document.body.classList.add("dark")</script><header class=header><nav class=nav><div class=logo><a href=https://imwenbin.com/ accesskey=h title="wenbin (Alt + H)">wenbin</a>
<span class=logo-switches><button id=theme-toggle accesskey=t title="(Alt + T)"><svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg><svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg></button></span></div><ul id=menu><li><a href=https://imwenbin.com/blog/ title=Blog><span>Blog</span></a></li><li><a href=https://imwenbin.com/archives title=Archive><span>Archive</span></a></li><li><a href=https://imwenbin.com/tags title=Tags><span>Tags</span></a></li></ul></nav></header><main class=main><article class=post-single><header class=post-header><div class=breadcrumbs><a href=https://imwenbin.com/>Home</a>&nbsp;»&nbsp;<a href=https://imwenbin.com/blog/>Blogs</a></div><h1 class=post-title>CocoaPods 命令的详细介绍</h1><div class=post-meta><span title='2021-11-18 09:32:36 +0800 CST'>⌚️ 2021-11-18</span></div></header><div class=toc><details><summary accesskey=c title="(Alt + C)"><span class=details>目录</span></summary><div class=inner><ul><li><a href=#%e5%89%8d%e8%a8%80 aria-label=前言>前言</a></li><li><a href=#podfile-%e6%96%87%e4%bb%b6 aria-label="Podfile 文件">Podfile 文件</a></li><li><a href=#pod-install aria-label="pod install">pod install</a></li><li><a href=#pod-outdated aria-label="pod outdated">pod outdated</a></li><li><a href=#pod-update aria-label="pod update">pod update</a></li><li><a href=#%e7%94%a8%e9%80%94%e5%ae%9e%e4%be%8b aria-label=用途实例>用途实例</a></li><li><a href=#%e6%9c%80%e5%90%8e aria-label=最后>最后</a></li></ul></div></details></div><div class=post-content><blockquote><p>本文按照官网的叙述用大白话“翻译”出来，加上个人的经验和见解，可以更方便理解</p></blockquote><p>参考链接<a href=https://guides.cocoapods.org/using/pod-install-vs-update.html> CocoaPods官网之命令的详细介绍</a></p><h2 id=前言>前言<a hidden class=anchor aria-hidden=true href=#前言>#</a></h2><p>很多同学们分不清 <code>pod install</code> 和 <code>pod update</code> 命令的区别和用法，认为 <code>pod install</code> 只有第一次安装时和报错提示时使用，其实<strong>不是这样的</strong>。第三方库的版本有时候决定了我们开发的进度和心情，管理好这些版本可以使开发者更方便的使用。</p><p>先从Podfile文件讲起。</p><h2 id=podfile-文件>Podfile 文件<a hidden class=anchor aria-hidden=true href=#podfile-文件>#</a></h2><p><img loading=lazy src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMjQwNzk5Mi0xZjExNjIyNzU3NmI1ZTQ2LnBuZw?x-oss-process=image/format,png" alt="pod init"></p><p>新建的Podfile文件，添加了 <code>inhibit_all_warnings!</code>，作用是忽略第三方库的警告。</p><p><code># platform :ios, '9.0'</code> 把 <code>#</code> 删了，作用是指定平台和版本，否则 <code>pod install</code> 后会出现警告，但是貌似没什么副作用。</p><p><code># use_frameworks!</code>，一般混编或是用 <code>Swift</code> 导入时需要打开，其它情况不用处理即可。</p><p><strong>接下来是个容易被忽略的点</strong></p><p><code>pod 'FMDB', '2.0'</code>
<code>pod 'FMDB', '~> 2.0'</code></p><p>区别就是：
<code>pod 'FMDB', '2.0'</code> 只会导入2.0版本的
<code>pod 'FMDB', '~> 2.0'</code> 会导入2.0大版本的最新版，比如最新版是2.9，那这样写就会导入2.9版本，但是不会超过3.0版本。</p><h2 id=pod-install>pod install<a hidden class=anchor aria-hidden=true href=#pod-install>#</a></h2><p>第一次都会使用该命令，会把每个安装的库的版本写入 <code>Podfile.lock</code> 文件中，不管有没有指定库的版本，都会把当前安装的版本写入。</p><p>在后面添加或删除库时使用该命令不会影响到其余库的版本，因为 <code>Podfile.lock</code> 已经锁定了，不会去检查更新每个库的版本。</p><h2 id=pod-outdated>pod outdated<a hidden class=anchor aria-hidden=true href=#pod-outdated>#</a></h2><p>会列出当前所有库的最新版本</p><h2 id=pod-update>pod update<a hidden class=anchor aria-hidden=true href=#pod-update>#</a></h2><p>如果采用 <code>pod 'FMDB', '~> 2.0'</code> 导入并执行 <code>pod update</code> 则会检查更新到最新版本，例如2.9。
如果没有指定版本，只是 <code>pod 'FMDB</code> ，则会更新到最新的版本，例如4.2.3。</p><p>总之会忽略 <code>Podfile.lock</code> 中已经锁定的版本。</p><p><code>pod update PODNAME</code> 会检查并更新指定库的版本。
<code>pod update</code> 会检查并更新所有库的版本。</p><p>执行完该命令后，会将新版本的版本号写入 <code>Podfile.lock</code> 中。</p><h2 id=用途实例>用途实例<a hidden class=anchor aria-hidden=true href=#用途实例>#</a></h2><p>比如A和B两个人一起合作写代码。</p><p>A引入一个库版本为1.0，<code>pod install</code> 后使用，此时这个库可能有2.0版本了。B拉下项目后 <code>pod install</code> 就会和A使用同一环境的pod，这时B添加一个库进去，执行 <code>pod install</code> A也执行 <code>pod install</code> ，他们还是同一环境。</p><p>但是如果B拉下项目后执行了 <code>pod update</code> ，那么库的版本从1.0更新到了2.0，到时候B添加项目，A执行 <code>pod install</code> 后逻辑就会出问题了。</p><p>如果必须更新某个库，一定要执行 <code>pod update PODNAME</code>，并且制定版本号，方便你我他使用。</p><h2 id=最后>最后<a hidden class=anchor aria-hidden=true href=#最后>#</a></h2><p>在开发中不管是单人还是多人，使用pod优先使用 <code>pod install</code> 命令，并且养成指定版本号的习惯。
最重要的是知道自己的逻辑，到底是要更新还是直接安装。</p><p><strong>push的时候一定要把 <code>Podfile.lock</code> 文件提交上去，要不就乱套了</strong>
<strong>push的时候一定要把 <code>Podfile.lock</code> 文件提交上去，要不就乱套了</strong>
<strong>push的时候一定要把 <code>Podfile.lock</code> 文件提交上去，要不就乱套了</strong></p><p>完。</p></div><footer class=post-footer><ul class=post-tags><li><a href=https://imwenbin.com/tags/ios%E5%BC%80%E5%8F%91%E6%9D%82%E8%B4%A7/>iOS开发杂货</a></li><li><a href=https://imwenbin.com/tags/cocoapods/>CocoaPods</a></li></ul><nav class=paginav><a class=prev href=https://imwenbin.com/blog/pod-install-%E5%92%8C-rvm-install-ruby-xxxx%E6%8A%A5%E9%94%99%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/><span class=title>« Prev Page</span><br><span>pod install 和 rvm install ruby-xxxx报错解决办法</span></a>
<a class=next href=https://imwenbin.com/blog/xcode%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E5%BC%95%E5%85%A5pod%E6%96%87%E4%BB%B6%E6%8A%A5%E9%94%99%E6%89%BE%E4%B8%8D%E5%88%B0/><span class=title>Next Page »</span><br><span>Xcode单元测试引入pod文件报错找不到</span></a></nav></footer></article></main><footer class=footer><span>&copy; 2023 <a href=https://imwenbin.com/>wenbin</a>.</span>
<span>保留部分权利。</span>
<span><a href=https://beian.miit.gov.cn>津ICP备2021008823号</a></span>
<span style="width:300px;margin:0 auto;padding:20px 0"><a target=_blank href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=12010302002359" style=display:inline-block;text-decoration:none;height:20px;line-height:20px><img src=/备案图标.png style=float:left;width:16px><p>津公网安备 12010302002359号</p></a></span></footer><a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentcolor"><path d="M12 6H0l6-6z"/></svg></a><script>let menu=document.getElementById("menu");menu&&(menu.scrollLeft=localStorage.getItem("menu-scroll-position"),menu.onscroll=function(){localStorage.setItem("menu-scroll-position",menu.scrollLeft)}),document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();var t=this.getAttribute("href").substr(1);window.matchMedia("(prefers-reduced-motion: reduce)").matches?document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView():document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({behavior:"smooth"}),t==="top"?history.replaceState(null,null," "):history.pushState(null,null,`#${t}`)})})</script><script>var mybutton=document.getElementById("top-link");window.onscroll=function(){document.body.scrollTop>800||document.documentElement.scrollTop>800?(mybutton.style.visibility="visible",mybutton.style.opacity="1"):(mybutton.style.visibility="hidden",mybutton.style.opacity="0")}</script><script>document.getElementById("theme-toggle").addEventListener("click",()=>{document.body.className.includes("dark")?(document.body.classList.remove("dark"),localStorage.setItem("pref-theme","light")):(document.body.classList.add("dark"),localStorage.setItem("pref-theme","dark"))})</script><script>document.querySelectorAll("pre > code").forEach(e=>{const n=e.parentNode.parentNode,t=document.createElement("button");t.classList.add("copy-code"),t.innerText="copy";function s(){t.innerText="copied!",setTimeout(()=>{t.innerText="copy"},2e3)}t.addEventListener("click",t=>{if("clipboard"in navigator){navigator.clipboard.writeText(e.textContent),s();return}const n=document.createRange();n.selectNodeContents(e);const o=window.getSelection();o.removeAllRanges(),o.addRange(n);try{document.execCommand("copy"),s()}catch{}o.removeRange(n)}),n.classList.contains("highlight")?n.appendChild(t):n.parentNode.firstChild==n||(e.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName=="TABLE"?e.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(t):e.parentNode.appendChild(t))})</script></body></html>